
#define Swing_Variable
#include "userDef.h"
U8      PowerOffResetFlag = 0; // 遥控器关机 进行 摆叶进行复位的标志
ver_Step_typeDef ver_Step;
hor_Step_typeDef hor_Step;

//
void VerSwAct( void )
{
    if ( ErrFlagQT != 0 && f_HeaterErr == 0 )
    {
        ver_Step.UpperLimit = ver_Step.SwNow;
        ver_Step.LowerLimit = ver_Step.SwNow;
        return;
    }

    if ( e_verSw.run >= 4 )
    {
        VerSwRst();
    }
    else if ( e_verSw.run >= 1 )
    {
        VerSwClose();
    }
    else 
    {
        VerSwJudge();
    }
}


void VerSwRst( void )
{
    ver_Step.UpperLimit = 0;
    ver_Step.LowerLimit = 0;

    //ver_Step.UpperLimit = 0;
    //ver_Step.LowerLimit = 0;
    if ( ver_Step.SwNow == 0 )
    {
        // e_verSw.run = SW_NORM;
        e_verSw.run = SW_OFF1;
    }
}


void VerSwClose( void )
{
    if ( e_verSw.run == SW_OFF1 )
    {
        //ver_Step.SwNow = ver_Step.SwNow + 7;
        //ver_Step.SwNow = ( U8 ) ( 103.0f / 0.704f );        
        e_verSw.run = SW_OFF2;
    }
    else 
    {
        ver_Step.UpperLimit = 43;
        ver_Step.LowerLimit = 43;

        //ver_Step.UpperLimit = 0;
        //ver_Step.LowerLimit = 0;

        /*
                if (f_VerSwAdd == 1)
                {
                   f_VerSwAdd = 0;
                }
        */
        //if (ver_Step.SwNow == 0)
        if ( PowerOffResetFlag == 2 ) // 遥控器 关机 复位，回到标准位置
        {
            PowerOffResetFlag = 0;
        }

        if ( ver_Step.SwNow == 43 )
        {
            e_verSw.run = SW_NORM;
        }

        /*
        if ( ver_Step.SwNow <= 1 )
        {
            ver_Step.UpperLimit = ( U8 ) ( 30.0f / 0.704f );
            ver_Step.LowerLimit = ( U8 ) ( 30.0f / 0.704f );
            e_verSw.run = SW_NORM;
        }
        */
    }
}


void VerSwJudge( void )
{
    U8      min;

    min     = ver_Step.SwACold;

    if ( min >= ver_Step.SwStep[SWHEAT][STEP1] ) // 防冷风角度，大于制热 Step1
    {
        min     = ver_Step.SwStep[SWHEAT][STEP1];
    }

    if ( min >= ver_Step.SwStep[SWCOOL][STEP1] ) // 防冷风角度，大于制冷 Step1
    {
        min     = ver_Step.SwStep[SWCOOL][STEP1];
    }

    if ( min >= ver_Step.SwStep[SWHEAT][STEP5] ) // 防冷风角度，大于制热 Step5
    {
        min     = ver_Step.SwStep[SWHEAT][STEP5];
    }

	
    if ( min >= ver_Step.SwStep[SWCOOL][STEP5] ) // 防冷风角度，大于制冷 Step5
    {
        min     = ver_Step.SwStep[SWCOOL][STEP5];
    }

    if ( ( ver_Step.SwNow >= min && ( ErrFlagQT == 0 || f_HeaterErr == 1 ) ) || f_quickTest == ON ) // 当前角度 大于 mim，
    {
        f_SwToFanAct = 1;
    }

    if ( f_HeaterErr == 1 ) // 加热器 报错， 上下导风角度 是 制冷默认角度
    {
        ver_Step.UpperLimit = ver_Step.SwDefault[SWCOOL];
        ver_Step.LowerLimit = ver_Step.SwDefault[SWCOOL];
    }
    else if ( b_power.run == ON ) // 开机时刻
    {
        PowerOffResetFlag = 1;          // 关机摆叶复位标志位置1

        if ( f_MotorErr == 1 || f_ZeroErr == 1 || f_OutErr_Ub == 1 ) // 电机报错，过零检测错误，停在当前 
        {
            ver_Step.UpperLimit = ver_Step.SwNow;
            ver_Step.LowerLimit = ver_Step.SwNow;
        }
        else if ( SetSwStepValue != 0 ) // 按下摆叶按键 
        {
            ver_Step.UpperLimit = swStepJudge( SetSwStepValue );
            ver_Step.LowerLimit = swStepJudge( SetSwStepValue );
        }
        else if ( CapTestStat != 0 && f_TestSwChg == 0 ) // 测试模式的摆叶 调整
        {
            if ( e_mode.run == MODEHEAT ) // 制热
            {
                ver_Step.UpperLimit = ver_Step.SwTest[SWHEAT];
                ver_Step.LowerLimit = ver_Step.SwTest[SWHEAT];
            }
            else 
            {
                ver_Step.UpperLimit = ver_Step.SwTest[SWCOOL];
                ver_Step.LowerLimit = ver_Step.SwTest[SWCOOL];
            }
        }

        /*
        else if ( e_mode.run == MODEHEAT && ( f_RoomUnitOn == 0 || f_Defrosting == 1 || stat_AvoidCold <= ACLOW ) ) // 制热且（系统关或者化霜标志
        {
            ver_Step.UpperLimit = ver_Step.SwACold;
            ver_Step.LowerLimit = ver_Step.SwACold;
            f_SwRemEnd = 0;
        }
        */
        else if ( e_mode.run == MODEHEAT && stat_AvoidCold == ACSW5 ) // 制热模式 且 
        {
            ver_Step.UpperLimit = ver_Step.SwStep[SWHEAT][STEP5];
            ver_Step.LowerLimit = ver_Step.SwStep[SWHEAT][STEP5];
        }
        else if ( stat_EcoSw == 1 ) // ECO模式
        {
            ver_Step.UpperLimit = ver_Step.SwStep[SWCOOL][STEP4];
            ver_Step.LowerLimit = ver_Step.SwStep[SWCOOL][STEP4];
            f_SwRemEnd = 0;
        }
        else if ( f_SwRemEnd == 0 ) // 风机记忆角度标志 等于 0
        {
            if ( e_verSw.set[e_mode.set] == 0 ) // 各个模式下的 设定 摆叶角度==0
            {
                if ( e_mode.run == MODEHEAT ) //  制热模式
                {
                    if ( ver_Step.SwRem[SWHEAT] >= ver_Step.SwStep[SWHEAT][STEP1] ) // 记忆的制热大于 1档角度
                    {
                        ver_Step.UpperLimit = ver_Step.SwRem[SWHEAT]; // 制热模式的记忆角度
                        ver_Step.LowerLimit = ver_Step.SwRem[SWHEAT]; // 制热模式的记忆角度
                    }
                    else // 否则 是 制热模式的 默认角度
                    {
                        ver_Step.SwRem[SWHEAT] = 0;
                        ver_Step.UpperLimit = ver_Step.SwDefault[SWHEAT];
                        ver_Step.LowerLimit = ver_Step.SwDefault[SWHEAT];
                    }
                }
                else // 其他模式
                {
                    if ( ver_Step.SwRem[SWCOOL] >= ver_Step.SwStep[SWCOOL][STEP1] ) // 制冷模式
                    {
                        ver_Step.UpperLimit = ver_Step.SwRem[SWCOOL]; // 角度等于记忆制冷角度
                        ver_Step.LowerLimit = ver_Step.SwRem[SWCOOL]; // 角度等于记忆制冷角度
                    }
                    else // 否则
                    {
                        ver_Step.SwRem[SWCOOL] = 0;
                        ver_Step.UpperLimit = ver_Step.SwDefault[SWCOOL];
                        ver_Step.LowerLimit = ver_Step.SwDefault[SWCOOL];
                    }
                }
            }
            else 
            {
                if ( e_mode.run == MODEHEAT ) // 制热模式
                {
                    ver_Step.SwRem[SWHEAT] = 0;
                    ver_Step.UpperLimit = ver_Step.SwStep[SWHEAT][STEP5];
                    ver_Step.LowerLimit = ver_Step.SwStep[SWHEAT][STEP5];
                }
                else if ( e_mode.run == MODECOOL ) // 制冷模式
                {
                    ver_Step.SwRem[SWCOOL] = 0;
                    ver_Step.UpperLimit = ver_Step.SwStep[SWCOOL][STEP3];
                    ver_Step.LowerLimit = ver_Step.SwStep[SWCOOL][STEP3];
                }
                else if ( e_mode.run == MODEDRY ) // 除湿模式
                {
                    ver_Step.SwRem[SWCOOL] = 0;
                    ver_Step.UpperLimit = ver_Step.SwStep[SWCOOL][STEP1];
                    ver_Step.LowerLimit = ver_Step.SwStep[SWCOOL][STEP1];
                }
                else if ( e_mode.run == MODEFAN ) // 风扇模式
                {
                    ver_Step.SwRem[SWCOOL] = 0;
                    ver_Step.UpperLimit = ver_Step.SwStep[SWHEAT][STEP5];
                    ver_Step.LowerLimit = ver_Step.SwStep[SWHEAT][STEP5];
                }
                else // 其他模式
                {
                    ver_Step.SwRem[SWCOOL] = 0;
                    ver_Step.UpperLimit = ver_Step.SwStep[SWCOOL][STEP3];
                    ver_Step.LowerLimit = ver_Step.SwStep[SWCOOL][STEP3];
                }
            }

            if ( ver_Step.UpperLimit == ver_Step.SwNow && ver_Step.LowerLimit == ver_Step.SwNow )
            {
                f_SwRemEnd = 1;
            }
        }
        else 
        {
            if ( e_verSw.set[e_mode.set] == 0 )
            {
                //ver_Step.UpperLimit = ver_Step.SwNow;
                //ver_Step.LowerLimit = ver_Step.SwNow;
                if ( e_mode.run == MODEHEAT ) // 制热模式
                {
                    ver_Step.UpperLimit = ver_Step.SwStep[SWHEAT][STEP5];
                    ver_Step.LowerLimit = ver_Step.SwStep[SWHEAT][STEP5];
                }
                else if ( e_mode.run == MODECOOL ) // 制冷模式
                {
                    ver_Step.UpperLimit = ver_Step.SwStep[SWCOOL][STEP3];
                    ver_Step.LowerLimit = ver_Step.SwStep[SWCOOL][STEP3];
                }
                else if ( e_mode.run == MODEDRY ) // 除湿模式
                {
                    ver_Step.UpperLimit = ver_Step.SwStep[SWCOOL][STEP1];
                    ver_Step.LowerLimit = ver_Step.SwStep[SWCOOL][STEP1];
                }
                else if ( e_mode.run == MODEFAN ) // 风扇模式
                {
                    ver_Step.UpperLimit = ver_Step.SwStep[SWHEAT][STEP5];
                    ver_Step.LowerLimit = ver_Step.SwStep[SWHEAT][STEP5];
                }
                else // 其他模式
                {
                    ver_Step.UpperLimit = ver_Step.SwStep[SWCOOL][STEP3];
                    ver_Step.LowerLimit = ver_Step.SwStep[SWCOOL][STEP3];
                }

                /*
                   if (e_mode.run == MODEHEAT)
                   {
                       if (ver_Step.SwNow >= ver_Step.SwStep[SWHEAT][STEP1])
                       {
                           ver_Step.SwRem[SWHEAT] = ver_Step.SwNow;
                       }
                   }
                   else
                   {
                       if (ver_Step.SwNow >= ver_Step.SwStep[SWCOOL][STEP1])
                       {
                           ver_Step.SwRem[SWCOOL] = ver_Step.SwNow;
                       }
                   }
                */
            }
            else if ( e_verSw.set[e_mode.set] > 1 && e_verSw.set[e_mode.set] < 7 )
            {
                if ( e_mode.run == MODEHEAT )
                {
                    ver_Step.UpperLimit = ver_Step.SwStep[SWHEAT][e_verSw.set[e_mode.set] -2];
                    ver_Step.LowerLimit = ver_Step.SwStep[SWHEAT][e_verSw.set[e_mode.set] -2];
                }
                else 
                {
                    ver_Step.UpperLimit = ver_Step.SwStep[SWCOOL][e_verSw.set[e_mode.set] -2];
                    ver_Step.LowerLimit = ver_Step.SwStep[SWCOOL][e_verSw.set[e_mode.set] -2];
                }
            }
            else 
            {
                if ( e_mode.run == MODEHEAT )
                {
                    ver_Step.UpperLimit = ver_Step.SwStep[SWHEAT][STEP5];
                    ver_Step.LowerLimit = ver_Step.SwStep[SWHEAT][STEP2];
                }
                else 
                {
                    ver_Step.UpperLimit = ver_Step.SwStep[SWCOOL][STEP5];
                    ver_Step.LowerLimit = ver_Step.SwStep[SWCOOL][STEP2];
                }
            }
        }
    }
    else // 关机时刻的 摆叶 
    {
        if ( DryerActMin > 0 ) // 干燥
        {
            ver_Step.UpperLimit = ver_Step.SwDefault[SWCOOL];
            ver_Step.LowerLimit = ver_Step.SwDefault[SWCOOL];
        }
        else if ( HeatOffBlowSec > 0 ) // 
        {
            ver_Step.UpperLimit = ver_Step.SwACold;
            ver_Step.LowerLimit = ver_Step.SwACold;
        }
        else if ( ver_Step.SwNow > 0 ) //
        {
            if ( PowerOffResetFlag == 1 )
            {
                PowerOffResetFlag = 2;
                e_verSw.run = SW_RST1;  // 遥控器关机 再 执行一次复位
                ver_Step.SwNow = ver_Step.SwRst;
            }
            else 
            {
                e_verSw.run = SW_OFF1;
            }

            //e_verSw.run = SW_OFF1;
            f_SwToFanAct = 0;
        }

        f_SwRemEnd = 0;
    }
}


void HorSwAct( void )
{
    if ( ErrFlagQT != 0 && f_HeaterErr == 0 )
    {
        hor_Step.UpperLimit = hor_Step.SwNow;
        hor_Step.LowerLimit = hor_Step.SwNow;
        return;
    }



    if ( e_horSw.run >= 4 )
    {
        HorSwRst();
    }
    else if ( e_horSw.run >= 1 )
    {
        HorSwClose();
    }
    else 
    {
        HorSwJudge();
    }
}


void HorSwRst( void )
{
    if ( e_horSw.run == SW_RST1 )
    {
        hor_Step.UpperLimit = 0;
        hor_Step.LowerLimit = 0;

        if ( hor_Step.SwNow == 0 )
        {
            e_horSw.run = SW_RST2;
        }
    }
    else if ( e_horSw.run == SW_RST2 )
    {
        hor_Step.UpperLimit = hor_Step.SwStep[STEP3];
        hor_Step.LowerLimit = hor_Step.SwStep[STEP3];

        if ( hor_Step.SwNow == hor_Step.SwStep[STEP3] )
        {
            e_horSw.run = SW_NORM;
        }
    }
}


void HorSwClose( void )
{
    if ( e_horSw.run == SW_OFF1 )
    {
        hor_Step.UpperLimit = hor_Step.SwStep[STEP3];
        hor_Step.LowerLimit = hor_Step.SwStep[STEP3];
    }

    if ( hor_Step.UpperLimit == hor_Step.SwNow && hor_Step.LowerLimit == hor_Step.SwNow )
    {
        e_horSw.run = SW_NORM;
    }
}


void HorSwJudge( void )
{
    if ( b_power.run == ON )
    {
        if ( PerformanceTest.PerformanceTestOccurFlag == 1 )
        {
            if ( e_mode.run == MODEHEAT )
            {
                ver_Step.UpperLimit = PerformanceTest.HorizontalAngle[SWHEAT];
                ver_Step.LowerLimit = PerformanceTest.HorizontalAngle[SWHEAT];
            }
            else 
            {
                ver_Step.UpperLimit = PerformanceTest.HorizontalAngle[SWCOOL];
                ver_Step.LowerLimit = PerformanceTest.HorizontalAngle[SWCOOL];
            }

            return;
        }

        if ( e_fanStep.run == FANSTOP || e_horSw.set[e_mode.set] == 0 )
        {
            hor_Step.UpperLimit = hor_Step.SwNow;
            hor_Step.LowerLimit = hor_Step.SwNow;
        }
        else if ( e_horSw.set[e_mode.set] > 1 && e_horSw.set[e_mode.set] < 7 )
        {
            hor_Step.UpperLimit = hor_Step.SwStep[e_horSw.set[e_mode.set] -2];
            hor_Step.LowerLimit = hor_Step.SwStep[e_horSw.set[e_mode.set] -2];
        }
        else 
        {
            hor_Step.UpperLimit = hor_Step.SwStep[STEP5];
            hor_Step.LowerLimit = hor_Step.SwStep[STEP1];
        }
    }
    else 
    {
        e_horSw.run = SW_OFF1;
    }
}


void SwingDriver( void )
{
    static U8 timer_SwDriver = 0;       // 电机普通运行计时
    static U8 timer_SwDriverQ = 0;      // 电机快速运行计时

    if ( f_ADCEnd == ON )
    {
        timer_SwDriverQ++;

        if ( timer_SwDriverQ >= 8 )
        {
            if ( ver_Step.UpperLimit == ver_Step.LowerLimit ) // 上电复位是 4ms 一步
            {
#ifdef SWING_VERTICAL
                VerSwRun();
#endif // SWING_VERTICAL
            }

            if ( hor_Step.UpperLimit == hor_Step.LowerLimit )
            {
#ifdef SWING_HORIZONTAL
                HorSwRun();
#endif // SWING_HORIZONTAL
            }

            timer_SwDriverQ = 0;
        }

        timer_SwDriver++;

        if ( timer_SwDriver >= 50 )
        {
            if ( ver_Step.UpperLimit != ver_Step.LowerLimit ) // 按下摆叶 一步是 25ms
            {
#ifdef SWING_VERTICAL
                VerSwRun();
#endif // SWING_VERTICAL
            }

            if ( hor_Step.UpperLimit != hor_Step.LowerLimit )
            {
#ifdef SWING_HORIZONTAL
                HorSwRun();
#endif // SWING_HORIZONTAL
            }

            timer_SwDriver = 0;
        }
    }
}


#ifdef SWING_VERTICAL


void VerSwRun( void )
{
    if ( ver_Step.SwNow == ver_Step.UpperLimit && ver_Step.SwNow == ver_Step.LowerLimit && ver_Step.SwCount == 0 )
    {
        portVerSw = 0;
    }
    else 
    {
        if ( ver_Step.SwNow > ver_Step.UpperLimit && ver_Step.SwCount == 0 )
        {
            f_VerSwAdd = 0;
        }
        else if ( ver_Step.SwNow < ver_Step.LowerLimit && ver_Step.SwCount == 0 )
        {
            f_VerSwAdd = 1;
        }

        if ( f_VerSwAdd == 0 )
        {
            portVerSw = tab_AntiClockwise[ver_Step.SwCount];
        }
        else 
        {
            portVerSw = tab_Clockwise[ver_Step.SwCount];
        }

        if ( ver_Step.SwCount < 7 )
        {
            ver_Step.SwCount++;
        }
        else 
        {
            ver_Step.SwCount = 0;

            if ( f_VerSwAdd == 0 )
            {
                if ( ver_Step.SwNow > 0 )
                {
                    ver_Step.SwNow--;
                }
            }
            else 
            {
                if ( ver_Step.SwNow <= 0xFE )
                {
                    ver_Step.SwNow++;
                }
            }
        }
    }

    // IO_VERSW1 = f_VerSw1;
    // IO_VERSW2 = f_VerSw2;
    // IO_VERSW3 = f_VerSw3;
    // IO_VERSW4 = f_VerSw4;
    if ( f_VerSw1 )
    {
        IO_VERSW1_ON;
    }
    else 
    {
        IO_VERSW1_OFF;
    }

    if ( f_VerSw2 )
    {
        IO_VERSW2_ON;
    }
    else 
    {
        IO_VERSW2_OFF;
    }

    if ( f_VerSw3 )
    {
        IO_VERSW3_ON;
    }
    else 
    {
        IO_VERSW3_OFF;
    }

    if ( f_VerSw4 )
    {
        IO_VERSW4_ON;
    }
    else 
    {
        IO_VERSW4_OFF;
    }
}


#endif // SWING_VERTICAL

#ifdef SWING_HORIZONTAL


void HorSwRun( void )
{
    if ( hor_Step.SwNow == hor_Step.UpperLimit && hor_Step.SwNow == hor_Step.LowerLimit && hor_Step.SwCount == 0 )
    {
        portHorSw = 0;
    }
    else 
    {
        if ( hor_Step.SwNow > hor_Step.UpperLimit && hor_Step.SwCount == 0 )
        {
            f_HorSwAdd = 0;
        }
        else if ( hor_Step.SwNow < hor_Step.LowerLimit && hor_Step.SwCount == 0 )
        {
            f_HorSwAdd = 1;
        }

        if ( f_HorSwAdd == 0 )
        {
            portHorSw = tab_Clockwise[hor_Step.SwCount];
        }
        else 
        {
            portHorSw = tab_AntiClockwise[hor_Step.SwCount];
        }

        if ( hor_Step.SwCount < 7 )
        {
            hor_Step.SwCount++;
        }
        else 
        {
            hor_Step.SwCount = 0;

            if ( f_HorSwAdd == 0 )
            {
                if ( hor_Step.SwNow > 0 )
                {
                    hor_Step.SwNow--;
                }
            }
            else 
            {
                if ( hor_Step.SwNow <= 0xFE )
                {
                    hor_Step.SwNow++;
                }
            }
        }
    }

    // IO_HORSW1 = f_HorSw1;
    // IO_HORSW2 = f_HorSw2;
    // IO_HORSW3 = f_HorSw3;
    // IO_HORSW4 = f_HorSw4;
    if ( f_HorSw1 )
    {
        IO_HORSW1_ON;
    }
    else 
    {
        IO_HORSW1_OFF;
    }

    if ( f_HorSw2 )
    {
        IO_HORSW2_ON;
    }
    else 
    {
        IO_HORSW2_OFF;
    }

    if ( f_HorSw3 )
    {
        IO_HORSW3_ON;
    }
    else 
    {
        IO_HORSW3_OFF;
    }

    if ( f_HorSw4 )
    {
        IO_HORSW4_ON;
    }
    else 
    {
        IO_HORSW4_OFF;
    }
}


#endif // SWING_HORIZONTAL

